home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-08 | 15.5 KB | 560 lines | [TEXT/MPS ] |
- /*
- File: Panel.h
-
- Contains: Panel Classes Definition
-
- Written by: Steve Smith
-
- Copyright: © 1995 by Apple Computer, Inc., all rights reserved.
- */
-
- // -- PanelEditor Includes --
-
- #ifndef _FRAMEPE_
- #include "FramePE.h"
- #endif
-
- #ifndef _PANELEDITORDEF_
- #include "PanelEditorDef.h"
- #endif
-
- #ifndef _PANELEDITORGLOBALS_
- #include "PanelEditorGlobals.h"
- #endif
-
- #ifndef _PANELEDITORUTILS_
- #include "PanelEditorUtils.h"
- #endif
-
- #ifndef _SAMPLECOLLECTIONS_
- #include "SampleCollections.h"
- #endif
-
- // -- OpenDoc Includes --
-
- #ifndef _ODTYPES_
- #include <ODTypes.h>
- #endif
-
- #ifndef SOM_ODPart_xh
- #include <Part.xh>
- #endif
-
- #ifndef SOM_ODFacet_xh
- #include <Facet.xh>
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include <Frame.xh>
- #endif
-
- #ifndef SOM_ODFrameFacetIterator_xh
- #include <FrFaItr.xh>
- #endif
-
- #ifndef SOM_ODDraft_xh
- #include <Draft.xh>
- #endif
-
- // -- OpenDoc Utilities --
-
- #ifndef _ODUTILS_
- #include <ODUtils.h>
- #endif
-
- #ifndef _EXCEPT_
- #include <Except.h>
- #endif
-
- #ifndef _TEMPOBJ_
- #include <TempObj.h>
- #endif
-
- #ifndef _TEMPITER_
- #include <TempIter.h>
- #endif
-
-
- #pragma segment PanelEditorPanel
-
- //==============================================================================
- // CFrame
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // Method: Constructor
- //
- // Description: This is the C++ class constructor.
- //------------------------------------------------------------------------------
-
- CFrame::CFrame()
- {
- fContainingFrames = kODNULL;
- fFrames = kODNULL;
- fPartDisplayed = kODNULL;
- fInited = kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // Method: InitPanel
- //
- // Description: This is the C++ class constructor.
- //------------------------------------------------------------------------------
-
- void CFrame::InitFrame()
- {
- fContainingFrames = new CFrameList;
- fFrames = new CFrameList;
- fInited = kODTrue;
- }
-
- //------------------------------------------------------------------------------
- // Method: Destructor
- //
- // Description: This is the C++ class Destructor.
- //------------------------------------------------------------------------------
-
- CFrame::~CFrame()
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- ODDeleteObject(fContainingFrames);
- ODDeleteObject(fFrames);
- ODSafeReleaseObject(fPartDisplayed);
- }
-
- //------------------------------------------------------------------------------
- // Method: NewFrame
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::NewFrame(Environment* ev, ODFrame* containingFrame)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- ODDraft* draft = ODGetDraft(ev, containingFrame);
-
- ODRect bounds = this->GetFrameBounds(ev, containingFrame);
-
- TempODShape frameShape = containingFrame->CreateShape(ev);
- frameShape->SetRectangle(ev, &bounds);
-
- TempODFrame frame = draft->CreateFrame(ev, this->GetFrameType(),
- containingFrame, frameShape, kODNULL,
- fPartDisplayed, gGlobals->fFrameView,
- this->GetPresentation(),
- this->MakeSubframe(), kODFalse);
- this->PrepareFrame(ev,frame);
-
- fFrames->Add(frame);
- }
-
- //------------------------------------------------------------------------------
- // Method: CreateFrames
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::CreateFrames( Environment* ev )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fContainingFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- this->NewFrame(ev, frame);
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: CreateFacets
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::CreateFacets( Environment* ev )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
-
- ODShape* frameShape = frame->AcquireFrameShape(ev, kODNULL);
- TempODShape clipShape = ODCopyAndRelease(ev, frameShape);
-
- TempODTransform externalTransform = frame->CreateTransform(ev);
-
- Point offset = this->GetFrameOffset();
- externalTransform->SetQDOffset(ev, &offset);
-
- TempODFrameFacetIterator fiter(ev, containingFrame);
- for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
- facet = fiter.Next() )
- {
- facet->CreateEmbeddedFacet(ev, frame, clipShape,
- externalTransform, kODNULL,
- kODNULL, kODNULL,
- kODFrameInFront);
- this->PrepareFacet(ev,facet);
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: RemoveFacets
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::RemoveFacets(Environment* ev, ODFrame* containingFrame)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
- {
- frame->Invalidate(ev, kODNULL, kODNULL);
- RemoveFacetsFromFrame(ev, frame);
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: AddFacets
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::AddFacets(Environment* ev, ODFrame* containingFrame)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
- {
- TempODFrameFacetIterator fiter(ev, containingFrame);
- for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
- facet = fiter.Next() )
- {
- this->AddFacet(ev, facet, frame);
- }
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: RemoveAll
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::RemoveAll( Environment* ev )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- // Remove and release the panel frame.
- fiter.ReleaseCurrent();
-
- // Record the parent frames so that we are able to recreate
- // things later.
- TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
- fContainingFrames->Add(containingFrame);
-
- // Delete all the facets.
- frame->Invalidate(ev, kODNULL, kODNULL);
- RemoveFacetsFromFrame(ev, frame);
- // Last minute house cleaning.
- this->CleanupFrame(ev,frame,kFrameRemoved);
- // Remove the frame from the draft.
- ODAcquireObject(ev,frame);
- frame->Remove(ev);
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: AddFrame
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::AddFrame( Environment* ev, ODFrame* containingFrame )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- // We lazily create the frames and facets because we dont' know
- // which part is in the "selection" until facets have been created.
- fContainingFrames->Add(containingFrame);
-
- // But, if we've already created and displayed frames, then we need to
- // add a new frame now.
- this->NewFrame(ev, containingFrame);
- }
-
- //------------------------------------------------------------------------------
- // Method: RemoveFrame
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::RemoveFrame( Environment* ev, ODFrame* containingFrame )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame contFrame = frame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
- {
- // Release our references to the frame and its containing frame.
- fiter.ReleaseCurrent();
- }
-
- // Delete all the facets and ask the frame to remove itself.
- RemoveFacetsFromFrame(ev, frame);
- ODAcquireObject(ev,frame);
- // Last minute house cleaning.
- this->CleanupFrame(ev,frame,kFrameRemoved);
- frame->Remove(ev);
- }
-
- // Remove the containing frame from our collections.
- fContainingFrames->Remove(containingFrame);
- }
-
- //------------------------------------------------------------------------------
- // Method: CloseFrame
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::CloseFrame( Environment* ev, ODFrame* containingFrame )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame contFrame = frame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
- {
- // Release our references to the frame and its containing frame.
- fiter.ReleaseCurrent();
- }
-
- // Delete all the facets and ask the frame to remove itself.
- RemoveFacetsFromFrame(ev, frame);
- ODAcquireObject(ev,frame);
- // Last minute house cleaning.
- this->CleanupFrame(ev,frame,kFrameClosed);
- frame->Close(ev);
- }
-
- // Remove the containing frame from our collections.
- fContainingFrames->Remove(containingFrame);
- }
-
- //------------------------------------------------------------------------------
- // Method: Resize
- //
- // Description: This method is called when a containing frame of this frame has
- // its frameshape changed.
- //------------------------------------------------------------------------------
-
- void CFrame::Resize( Environment* ev, ODFrame* containingFrame )
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- // Calculate the panel frame's shape based on it's parent frame.
- TempODFrame parentFrame = frame->AcquireContainingFrame(ev);
-
- if ( ODObjectsAreEqual(ev, parentFrame, containingFrame) )
- {
- ODRect bounds;
- TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
-
- bounds = this->GetFrameBounds(ev,containingFrame);
-
- TempODShape newFrameShape = frame->CreateShape(ev);
- newFrameShape->SetRectangle(ev, &bounds);
-
- // Change the panel frame shape.
- frame->ChangeFrameShape(ev, newFrameShape, kODNULL);
-
- // Iterate over the frame's facets and change their clip shapes.
-
- TempODFrameFacetIterator fiter(ev, frame);
- for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
- facet = fiter.Next() )
- {
- TempODShape newClipShape = newFrameShape->Copy(ev);
- facet->ChangeGeometry(ev, newClipShape, kODNULL, kODNULL);
- this->FacetChanged(ev,facet);
- }
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: AttachSourceFrame
- //
- // Description: This method is called in response to
- //------------------------------------------------------------------------------
-
- void CFrame::AttachSourceFrame(Environment* ev, ODFrame* contFrame,
- ODFrame* srcContFrame)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- ODFrame* frame = kODNULL;
- ODFrame* srcFrame = kODNULL;
-
- CFrameListIterator fiter(fFrames);
- for ( frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame containingFrame = frame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
- break;
- }
-
- for ( srcFrame=fiter.First();fiter.IsNotComplete();
- srcFrame=fiter.Next() )
- {
- TempODFrame containingFrame = srcFrame->AcquireContainingFrame(ev);
- if ( ODObjectsAreEqual(ev, srcContFrame, containingFrame) )
- break;
- }
-
- if ( frame && srcFrame )
- fPartDisplayed->AttachSourceFrame(ev,frame,srcFrame);
- }
-
- //------------------------------------------------------------------------------
- // Method: RemoveFacet
- //
- // Description: This method is called when
- //------------------------------------------------------------------------------
-
- void CFrame::RemoveFacet(Environment* ev, ODFacet* containingFacet)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- CList* tList = new CList;
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrameFacetIterator fiter(ev, frame);
- for ( ODFacet* facet = fiter.First(); fiter.IsNotComplete();
- facet = fiter.Next() )
- {
- if ( ODObjectsAreEqual(ev, facet->GetContainingFacet(ev), containingFacet) )
- tList->Add((ODPtr)facet);
- }
- }
-
- CListIterator iter(tList);
- for ( ODFacet* facet=(ODFacet*)iter.First();iter.IsNotComplete();
- facet=(ODFacet*)iter.Next() )
- {
- iter.RemoveCurrent();
- this->RemoveFacet(ev, containingFacet, facet);
- }
- delete tList;
- }
-
- //------------------------------------------------------------------------------
- // Method: RemoveFacet
- //
- // Description: This method is called when
- //------------------------------------------------------------------------------
-
- void CFrame::RemoveFacet(Environment* ev, ODFacet* containingFacet, ODFacet* facet)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- // Remove the facet from the visible hierarchy.
- containingFacet->RemoveFacet(ev, facet);
- // Last minute cleanup.
- this->CleanupFacet(ev,facet);
- // Delete the facet.
- ODDeleteObject(facet);
- }
-
- //------------------------------------------------------------------------------
- // Method: AddFacet
- //
- // Description: This method is called when
- //------------------------------------------------------------------------------
-
- void CFrame::AddFacet(Environment* ev, ODFacet* containingFacet)
- {
- ASSERT(fInited != kODFalse, kAssertionFailed);
-
- // Things are done lazily, so don't create a facet unless we
- // really need to.
-
- ODFrame* containingFrame = containingFacet->GetFrame(ev);
-
- CFrameListIterator fiter(fFrames);
- for ( ODFrame* frame=fiter.First();fiter.IsNotComplete();
- frame=fiter.Next() )
- {
- TempODFrame contFrame = frame->AcquireContainingFrame(ev);
-
- if ( ODObjectsAreEqual(ev, contFrame, containingFrame) )
- this->AddFacet(ev, containingFacet, frame);
- }
- }
-
- //------------------------------------------------------------------------------
- // Method: AddFacet
- //
- // Description: This method is called when
- //------------------------------------------------------------------------------
-
- void CFrame::AddFacet(Environment* ev, ODFacet* containingFacet, ODFrame* frame)
- {
- ODShape* frameShape = frame->AcquireFrameShape(ev, kODNULL);
- TempODShape clipShape = ODCopyAndRelease(ev, frameShape);
-
- TempODTransform externalTransform = frame->CreateTransform(ev);
-
- Point offset = this->GetFrameOffset();
- externalTransform->SetQDOffset(ev, &offset);
-
- ODFacet* facet = containingFacet->CreateEmbeddedFacet
- (ev, frame, clipShape,
- externalTransform, kODNULL,
- kODNULL, kODNULL,
- kODFrameInFront);
- this->PrepareFacet(ev,facet);
- }
-
-
-